'use strict';
const program = require('commander');
const colors = require('colors');
const maxCpus = require('os').cpus().length;


program.on('--help', () => {
  console.log('')
  console.log('  Examples:'.blue)
  console.log('')
  console.log('    $ xmysql -u username -p password -d databaseSchema'.blue)
  console.log('')
})

program
  .version(module.exports.version)
  .option('-h, --host <n>', 'hostname of database / localhost by default')
  .option('-u, --user <n>', 'username of database / root by default')
  .option('-p, --password <n>', 'password of database / empty by default')
  .option('-d, --database <n>', 'database schema name')
  .option('-r, --ipAddress <n>', 'IP interface of your server / localhost by default')
  .option('-n, --portNumber <n>', 'port number for app / 3000 by default')
  .option('-o, --port <n>', 'port number for mysql / 3306 by default')
  .option('-S, --socketPath <n>', 'unix socket path / not used by default')
  .option('-s, --storageFolder <n>', 'storage folder / current working dir by default / available only with local')
  .option('-i, --ignoreTables <n>', 'comma separated table names to ignore')
  .option('-a, --apiPrefix <n>', 'api url prefix / "/api/" by default')
  .option('-y, --readOnly', 'readonly apis / false by default')
  .option('-c, --useCpuCores <n>', 'use number of CPU cores (using cluster) / 1 by default')
  .parse(process.argv)


function paintHelp(txt) {
  return colors.magenta(txt) //display the help text in a color
}

function processInvalidArguments(program) {


  let err = '';

  if (!program.password) {
    err += 'Error: password for database is missing\n';
  }

  if (!program.database) {
    err += 'Error: database name is missing\n';
  }

  if (err !== '') {
    program.outputHelp(paintHelp)
    console.log(err.red)
  }
}

exports.handle = program => {

  /**************** START : default values ****************/
  program.ipAddress = program.ipAddress || "0.0.0.0";
  program.portNumber = program.portNumber || 3000;
  program.port = program.port || process.env.DATABASE_PORT;
  program.user = program.user || process.env.DATABASE_USER;
  program.password = program.password || process.env.DATABASE_PASSWORD;
  program.host = program.host || process.env.DATABASE_HOST;
  program.socketPath = program.socketPath || '';
  program.storageFolder = program.storageFolder || process.cwd()
  program.apiPrefix = program.apiPrefix || '/api/'
  program.readOnly = program.readOnly || false;
  program.useCpuCores = program.useCpuCores || 1;
  program.database = program.database || process.env.DATABASE_NAME;

  if(program.useCpuCores === '0') {
    program.useCpuCores = maxCpus;
  }

  if (program.ignoreTables) {
    let ignoreTables = program.ignoreTables.split(',')
    program.ignoreTables = {}
    for (var i = 0; i < ignoreTables.length; ++i) {
      program.ignoreTables[ignoreTables[i]] = ignoreTables[i];
    }
  } else {
    program.ignoreTables = {}
  }

  program.connectionLimit = 10;

  if (program.host === 'localhost' || program.host === '127.0.0.1' || program.host === '::1') {
    program.dynamic = 1
  }
  // console.log(program);
  /**************** END : default values ****************/


  if (program.database && program.host && program.user) {
    //console.log('Starting server at:', 'http://' + program.host + ':' + program.portNumber)
  } else {
    processInvalidArguments(program)
    process.exit(1)
  }

};
